// 基于 axios 封装的请求模块
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { refreshTokenAPI } from '@/api/refreshToken.js'
// 新建一个新的axios实例,本质还是axios
const ajax = axios.create({
  baseURL: 'http://toutiao.itheima.net' // 基地址
})

// 添加请求拦截器
ajax.interceptors.request.use(config => {
  // config就是请求的所带的数据
  // 对token进行统一的处理，如果vuex中有token，则在请求头中通过authorization，则在请求头中携带给后台
  if (store.state.token) {
    config.headers.Authorization = `Bearer ${store.state.token}`
  } else {
    config.headers.Authorization = `Bearer ${store.state.refreshToken}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

// 添加相应拦截器，可以对返回的数据或者错误做统一处理
ajax.interceptors.response.use(res => {
// http状态2xx 或3xx开头，执行成功的回调
  return res.data
}, async error => {
  // 401是一个典型的失败，表示token过期
  // token过期的解决方法，两种
  // 1.重新登录
  // 2.token续签 （配合refresh——token）

  // refreshtoken也过期了，直接跳转到登录页面
  if (error.response.data.message === 'refresh_token失效') {
    // 1.清空vuex里面的token
    store.commit('setToken', '')
    store.commit('refreshToken', '')
    // 2.跳转到登录页面
    router.replace({
      path: '/login?from' + router.currentRoute.path
    })
  }
  // 如果token过期了，可以尝试token的续签，如果refreshtoken也过期了，只能重新登录
  if (error.response.status === 401) {
    // 1.清空vuex里面的token
    store.commit('setToken', '')
    // 2.获取新的token
    const res = await refreshTokenAPI()
    const { token } = res.data
    // 3.更新到vuex中
    store.commit('setToken', token)
    // 4.完成上次没完成的请求
    // 要return 给组件这种await的地方
    return ajax(error.config)
  }
  return Promise.reject(error)
})

// 导出自定义函数
export default ({ method, url, headers, params, data }) => {
  return ajax({
    method,
    url,
    headers,
    params,
    data
  })
}
